package com.gdust.hzx.manager.service.impl;

import cn.hutool.core.date.DateUtil;
import com.gdust.hzx.manager.mapper.OrderStatisticsMapper;
import com.gdust.hzx.manager.service.OrderInfoService;
import com.gdust.hzx.model.dto.order.OrderStatisticsDto;
import com.gdust.hzx.model.entity.order.OrderStatistics;
import com.gdust.hzx.model.vo.order.OrderStatisticsVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;

/**
 * ClassName: OrderInfoServiceImpl
 * Package: com.gdust.spzx.manager.service.impl
 * Description: 订单信息服务的实现类，主要负责订单统计相关功能
 *
 * @Author syun
 * @Create 2024/12/24 17:37
 * @Version 1.0
 */
@Service
public class OrderInfoServiceImpl implements OrderInfoService {
    // 注入订单统计表的Mapper，用于操作数据库中订单统计相关数据
    @Autowired
    private OrderStatisticsMapper orderStatisticsMapper;

    /**
     * 根据搜索条件统计查询订单数据
     *
     * @param orderStatisticsDto 搜索条件数据传输对象，包含开始日期、结束日期等筛选条件
     * @return OrderStatisticsVo 封装的统计结果视图对象，包括日期列表和对应的总金额列表
     */
    @Override
    public OrderStatisticsVo getOrderStatisticsData(OrderStatisticsDto orderStatisticsDto) {
        //1.根据dto条件查询统计结构数据，返回list集合
        List<OrderStatistics> orderStatisticsList = orderStatisticsMapper.selectList(orderStatisticsDto);

        //2.遍历list集合。得到所有日期，把所有日期封装在list新集合里面
        List<String> dateList = orderStatisticsList.stream()
                .map(orderStatistics ->
                        DateUtil.format(orderStatistics.getOrderDate(), "yyyy-MM-dd"))// 格式化日期为字符串
                .collect(Collectors.toList());

        //3.遍历list集合，得到所有日期对应总金额，把总金额封装list新集合里面
        List<BigDecimal> decimalList = orderStatisticsList.stream()
                .map(OrderStatistics::getTotalAmount)
                .collect(Collectors.toList());

        //4.把两个list集合封装OrderStatisticsVo，返回OrderStatisticsVo
        OrderStatisticsVo orderStatisticsVo = new OrderStatisticsVo();
        orderStatisticsVo.setDateList(dateList);// 设置日期列表
        orderStatisticsVo.setAmountList(decimalList);// 设置金额列表

        // 返回封装好的统计结果视图对象
        return orderStatisticsVo;

    }
}
